# CMakeLists for common directory
#
# provides the protobuf interfaces

set(PROTO_FILES
    admin_commands.proto
    card_attributes.proto
    color.proto
    command_attach_card.proto
    command_change_zone_properties.proto
    command_concede.proto
    command_create_arrow.proto
    command_create_counter.proto
    command_create_token.proto
    command_deck_del.proto
    command_deck_del_dir.proto
    command_deck_download.proto
    command_deck_list.proto
    command_deck_new_dir.proto
    command_deck_select.proto
    command_deck_upload.proto
    command_del_counter.proto
    command_delete_arrow.proto
    command_draw_cards.proto
    command_dump_zone.proto
    command_flip_card.proto
    command_game_say.proto
    command_inc_card_counter.proto
    command_inc_counter.proto
    command_kick_from_game.proto
    command_leave_game.proto
    command_move_card.proto
    command_mulligan.proto
    command_next_turn.proto
    command_ready_start.proto
    command_replay_delete_match.proto
    command_replay_download.proto
    command_replay_get_code.proto
    command_replay_list.proto
    command_replay_modify_match.proto
    command_replay_submit_code.proto
    command_reveal_cards.proto
    command_reverse_turn.proto
    command_roll_die.proto
    command_set_active_phase.proto
    command_set_card_attr.proto
    command_set_card_counter.proto
    command_set_counter.proto
    command_set_sideboard_lock.proto
    command_set_sideboard_plan.proto
    command_shuffle.proto
    command_undo_draw.proto
    commands.proto
    context_concede.proto
    context_connection_state_changed.proto
    context_deck_select.proto
    context_move_card.proto
    context_mulligan.proto
    context_ping_changed.proto
    context_ready_start.proto
    context_set_sideboard_lock.proto
    context_undo_draw.proto
    event_add_to_list.proto
    event_attach_card.proto
    event_change_zone_properties.proto
    event_connection_closed.proto
    event_create_arrow.proto
    event_create_counter.proto
    event_create_token.proto
    event_del_counter.proto
    event_delete_arrow.proto
    event_destroy_card.proto
    event_draw_cards.proto
    event_dump_zone.proto
    event_flip_card.proto
    event_game_closed.proto
    event_game_host_changed.proto
    event_game_joined.proto
    event_game_say.proto
    event_game_state_changed.proto
    event_game_state_changed.proto
    event_join.proto
    event_join_room.proto
    event_kicked.proto
    event_leave.proto
    event_leave_room.proto
    event_list_games.proto
    event_list_rooms.proto
    event_move_card.proto
    event_notify_user.proto
    event_player_properties_changed.proto
    event_remove_from_list.proto
    event_remove_messages.proto
    event_replay_added.proto
    event_reveal_cards.proto
    event_reverse_turn.proto
    event_roll_die.proto
    event_room_say.proto
    event_server_complete_list.proto
    event_server_identification.proto
    event_server_message.proto
    event_server_shutdown.proto
    event_set_active_phase.proto
    event_set_active_player.proto
    event_set_card_attr.proto
    event_set_card_counter.proto
    event_set_counter.proto
    event_shuffle.proto
    event_user_joined.proto
    event_user_left.proto
    event_user_message.proto
    game_commands.proto
    game_event.proto
    game_event_container.proto
    game_event_context.proto
    game_replay.proto
    isl_message.proto
    moderator_commands.proto
    move_card_to_zone.proto
    response.proto
    response_activate.proto
    response_adjust_mod.proto
    response_ban_history.proto
    response_deck_download.proto
    response_deck_list.proto
    response_deck_upload.proto
    response_dump_zone.proto
    response_forgotpasswordrequest.proto
    response_get_admin_notes.proto
    response_get_games_of_user.proto
    response_get_user_info.proto
    response_join_room.proto
    response_list_users.proto
    response_login.proto
    response_password_salt.proto
    response_register.proto
    response_replay_download.proto
    response_replay_get_code.proto
    response_replay_list.proto
    response_viewlog_history.proto
    response_warn_history.proto
    response_warn_list.proto
    room_commands.proto
    room_event.proto
    server_message.proto
    serverinfo_arrow.proto
    serverinfo_ban.proto
    serverinfo_card.proto
    serverinfo_cardcounter.proto
    serverinfo_chat_message.proto
    serverinfo_counter.proto
    serverinfo_deckstorage.proto
    serverinfo_game.proto
    serverinfo_gametype.proto
    serverinfo_player.proto
    serverinfo_playerping.proto
    serverinfo_playerproperties.proto
    serverinfo_replay.proto
    serverinfo_replay_match.proto
    serverinfo_room.proto
    serverinfo_user.proto
    serverinfo_warning.proto
    serverinfo_zone.proto
    session_commands.proto
    session_event.proto
)

if(MSVC)
  set(unused_warning /wd4100)
else()
  set(unused_warning -Wno-unused-parameter)
endif()

if(${Protobuf_VERSION} VERSION_LESS "3.21.0.0")
  message(STATUS "Using Protobuf Legacy Mode")
  include_directories(${PROTOBUF_INCLUDE_DIRS})
  include_directories(${CMAKE_CURRENT_BINARY_DIR})
  protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_FILES})

  add_library(libcockatrice_protocol_pb ${PROTO_SRCS} ${PROTO_HDRS})
  target_compile_options(libcockatrice_protocol_pb PRIVATE ${unused_warning})
  set(libcockatrice_protocol_pb_LIBS ${PROTOBUF_LIBRARIES})
  if(UNIX)
    set(libcockatrice_protocol_pb_LIBS ${libcockatrice_protocol_pb_LIBS} -lpthread)
  endif(UNIX)
  target_link_libraries(libcockatrice_protocol_pb ${libcockatrice_protocol_pb_LIBS})

  # ubuntu uses an outdated package for protobuf, 3.1.0 is required
  if(${Protobuf_VERSION} VERSION_LESS "3.1.0")
    # remove unused parameter and misleading indentation warnings when compiling to avoid errors
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wno-unused-parameter -Wno-misleading-indentation")
    message(WARNING "Older protobuf version found (${Protobuf_VERSION} < 3.1.0), "
                    "disabled the warnings 'unused-parameter' and 'misleading-indentation' for protobuf generated code "
                    "to avoid compilation errors."
    )
  endif()
else()
  add_library(libcockatrice_protocol_pb ${PROTO_FILES})
  target_compile_options(libcockatrice_protocol_pb PRIVATE ${unused_warning})
  target_link_libraries(libcockatrice_protocol_pb PUBLIC protobuf::libprotobuf)
  set(PROTO_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
  target_include_directories(libcockatrice_protocol_pb PUBLIC "${PROTOBUF_INCLUDE_DIRS}")

  protobuf_generate(TARGET libcockatrice_protocol_pb IMPORT_DIRS "." PROTOC_OUT_DIR "${PROTO_BINARY_DIR}")
endif()
